<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //普通的创建对象
        var wanzhang = {
            name: "万章",
            age: 18,
            company: "潭州教育",
            sayName: function () {
                alert(this.name);
            }
        }
        var yinshi = {
            name: "银时",
            age: 18,
            company: "潭州教育",
            sayName: function () {
                alert(this.name);
            }
        }
        var afei = {
            name: "阿飞",
            age: 18,
            company: "潭州教育",
            sayName: function () {
                alert(this.name);
            }
        }
        //当我们在创建大量的结构相同的对象时, 工作量大且重复性高

        //工厂模式
        function Peo(name,age,company){
            var obj={};
            obj.name=name;
            obj.age=age;
            obj.company=company;
            obj.sayName=function(){
                console.log(this.name);
            }
            return obj;
        }
        //缺点  他还是obj  构造函数海之星Objiect
        var jiu=Peo("久久",20,"互联网金融");
        var ha=Peo("坚持",20,"不放弃系统");
        var xi=Peo("决断",20,"不犹豫集团");
        console.log(jiu);
        console.log(ha);
        console.log(xi);

        //构造函数模式
//          没有显式地创建对象； obj
//         直接将属性和方法赋给了this 对象； this 
//         没有return 语句。       return
        function fn(){
                console.log(this.name);
        }
        function Person(name,age,company){
            //var obj={};
            this.name=name;
            this.age=age;
            this.company=company;
            this.sayName=fn;
            //return obj;
        }
        var jiu1=new Person("久久",20,"互联网金融");
        var ha1=new Person("坚持",20,"不放弃系统");
        var xi1=new Person("决断",20,"不犹豫集团");
        console.log(jiu1);
        console.log(ha1);
        console.log(xi1);
        jiu1 instanceof Person;
        
        // 区别1
       // 任何函数，只要通过new操作符来调用，那它就可以作为构造函数；
        //任何函数，如果不通过new操作符来调用，那它跟普通函数也不会有什么两样
        // demo
        //直接运行构造函数,那么构造函数里面的this自动指向window
        //把普通函数当做构造函数使用时1:首先函数内的所有代码会自动执行一次
            //2:然后返回一个新的对象,该对象的constructor就是这个普通函数
        // 区别2
        //就是每个方法都要在每个实例上重新创建一遍。

    </script>
</body>
</html>